package TestExercises06;

//IO流

/*
随机点名器：
    TxT文件中事先准备好一些学生信息，每个学生的信息独占一行。
    要求1:每次被点到的学生，再次被点到的概率在原先的基础上降低一半。
    举例:80个学生，点名5次，每次都点到小A，概率变化情况如下:
         第一次每人概率:1.25%。
         第二次小A概率:0.625%。         其他学生概率:1.2579%
         第三次小A概率:0.3125%。        其他学生概率:1.261867%
         第四次小A概率:0.15625%。       其他学生概率:1.2638449%
         第五次小A概率:0.078125%。      其他学生概率:1.26483386%
    提示:本题的核心就是带权重的随机
 */


import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Matcher;

public class Test03 {
    public static void main(String[] args) throws IOException {

        //1、读取学生信息到内存中
        ArrayList<Student03> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("D:\\工作\\工作\\src\\names.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            String[] arr = line.split("-");
            Student03 stu = new Student03(arr[0], arr[1], Integer.parseInt(arr[2]), Double.parseDouble(arr[3]));
            list.add(stu);
        }
        br.close();

        //2、计算权重的总和
        double weight = 0;
        for (Student03 stu : list) {
            weight = weight + stu.getWeight();
        }

        //3、计算每一个人的实际占比
        double[] arr = new double[list.size()];
        int index = 0;
        for (Student03 stu : list) {
            arr[index] = stu.getWeight() / weight;
            index++;
        }

        //4、计算每一个人的权重占比范围
        for (int i = 1; i < arr.length; i++) {
            arr[i] = arr[i] + arr[i - 1];
        }

        //5、随机抽取
        //获取一个0.0~1.0之间的随机数
        double number = Math.random();
        //判断number在arr中的位置
        //二分查找法
        //方法返回值：- 插入点 - 1
        //获取number这个数据在数组当中的插入点位置
        int result = -Arrays.binarySearch(arr, number) - 1;
        Student03 stu = list.get(result);
        System.out.println(stu);

        //6、修改当前学生的权重
        double w = stu.getWeight() / 2;
        stu.setWeight(w);

        //7、把集合中的数据再次写到文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\工作\\工作\\src\\names.txt"));
        for (Student03 s : list) {
            bw.write(s.toString());
            bw.newLine();
        }
        bw.close();
    }
}

class Student03 {

    private String name;
    private String gender;
    private int age;
    private double weight;

    public Student03() {
    }

    public Student03(String name, String gender, int age, double weight) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.weight = weight;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return gender
     */
    public String getGender() {
        return gender;
    }

    /**
     * 设置
     *
     * @param gender
     */
    public void setGender(String gender) {
        this.gender = gender;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     *
     * @return weight
     */
    public double getWeight() {
        return weight;
    }

    /**
     * 设置
     *
     * @param weight
     */
    public void setWeight(double weight) {
        this.weight = weight;
    }

    public String toString() {
        return name + "-" + gender + "-" + age + "-" + weight;
    }
}
